package com.itheima.controller;

import com.itheima.pojo.User;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * <dl>
 * <dd>描述: ~节点业务逻辑实现</dd>
 * <dd>创建时间：  11:45 2020/7/17</dd>
 * <dd>创建人： zz</dd>
 * <dt>版本历史: </dt>
 * <pre>
 * Date         Author      Version     Description
 * ------------------------------------------------------------------
 * 2020/7/17      guodong       1.0        1.0 Version
 * </pre>
 * </dl>
 */

@RestController
@RequestMapping("consumer")
@DefaultProperties(defaultFallback = "defaultMethod") //声明当前类的默认熔断方法
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    /**
    * @Date: 11:48 2020/7/17
    * @Param: [id]
    * @return: com.itheima.pojo.User
    * @NewDescription: 根据id查询用户
    **/
    @GetMapping("findUserById/{id}")
    //@HystrixCommand(fallbackMethod = "fallMethod") //声明默认失败方法
    @HystrixCommand
    public User findUserById(@PathVariable("id")Integer id){

        /*方式一：
            1.url硬编码(写死了) ----》springcloud euraka（注册中心）
            2.负载均衡问题 ---》springcloud ribbon（负载均衡器）
            3.无法感知调用服务的状态 ---》springcloud hystrix（熔断器）
         */
        //String url = "http://localhost:9091/user/findUserById/" + id;

        /*方式二：
            通过注册中心服务列表的方式调用
            解决url硬编码
         */
       /* List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
        URI uri = instances.get(0).getUri();
        String url = uri + "/user/findUserById/" + id;*/

        /*方式三：
            使用ribbon

         */
        String url = "http://user-service/user/findUserById/" + id;
        User user = restTemplate.getForObject(url, User.class);
        return user;
    }

    /*
        默认熔断方法：
            1.返回值类型必须与原方法一致
            2.参数列表必须与原方法一致
            3.方法名称必须是 fallbackMethod中声明的方法名
     */
    public User fallMethod(Integer id){
        User user = new User();
        user.setId(id);
        user.setNote("默认熔断方法...");
        return user;
    }

    /*
        当前类的默认熔断方法：
            1.返回值类型必须相同
            2.不能带参数
            Result: flag msg data
     */
    public User defaultMethod(){
        User user = new User();
        user.setNote("当前类的默认熔断方法...");
        return user;
    }

    /*
        返回服务列表
     */
    @GetMapping("/getInstance")
    public List<ServiceInstance> getInstance(){
        List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
        return instances;
    }
}
